package com.zzyl.nursing.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.socket.config.annotation.EnableWebSocket;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * WebSocket服务端组件类
 *
 * @Author mr.wu
 * @Date 2025-5-30 9:15
 */
@Component
@EnableWebSocket
@ServerEndpoint("/ws/{sid}")
@Slf4j
public class WebSocketServer {

    private static Map<String, Session> sessionMap = new HashMap<>();

    /**
     * 建立连接时触发的方法
     *
     * @param sid
     * @param session
     */
    @OnOpen
    public void onOpen(@PathParam("sid") String sid, Session session) {
        log.info("会话{}建立了连接", sid);
        sessionMap.put(sid, session);
    }

    /**
     * 关闭连接时触发的方法
     *
     * @param sid
     * @param session
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid, Session session) {
        log.error("会话{}关闭了连接", sid);
        sessionMap.remove(sid);
    }

    /**
     * 连接出现问题时触发的方法
     *
     * @param sid
     * @param session
     */
    @OnError
    public void onError(@PathParam("sid") String sid, Session session, Throwable throwable) {
        log.error("会话{}连接出问题了，报错信息：{}", sid, throwable.getMessage());
        throwable.printStackTrace();
    }

    /**
     * 客户端发送消息时触发的方法
     *
     * @param sid
     * @param session
     */
    @OnMessage
    public void onMessage(@PathParam("sid") String sid, Session session, String message) {
        log.info("接收到会话{}，发送的消息：{}", sid, message);
    }

    /**
     * 群发消息
     *
     * @param msg
     */
    public void sendMsgToAll(String msg) {
        if (!CollectionUtils.isEmpty(sessionMap)) {
            sessionMap.values().forEach(x -> {
                try {
                    //发送消息给对应的客户端
                    x.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    /**
     * 给指定用户群发消息
     *
     * @param sid
     * @param msg
     */
    public void sendUserMessage(String sid, String msg) {
        Session session = sessionMap.get(sid);
        if (session != null) {
            try {
                session.getBasicRemote().sendText(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}